package br.edu.ifce.mflj.comunicacao;

import java.awt.event.MouseEvent;
import java.io.Serializable;

import br.edu.ifce.mflj.dados.Usuario;
import br.edu.ifce.mflj.exception.PacoteInvalidoException;

public class Pacote implements Serializable {

	private static final long serialVersionUID = -4203531136810142043L;

	private TipoPacote	tipoPacote;
	private	Object		payload;
	private String		identificadorDoDestinatario,
						identificadorDoRemetente;

	public Pacote( TipoPacote tipoPacote, Object payload, String identificadorDoRemetente, String identificadorDoDestinatario ) throws PacoteInvalidoException {
		this.tipoPacote						= tipoPacote;
		this.identificadorDoDestinatario	= identificadorDoDestinatario;
		this.identificadorDoRemetente		= identificadorDoRemetente;

		if( this.tipoPacote.equals( TipoPacote.MENSAGEM ) ){
			try{
				this.payload = (String)payload;
				
			} catch( ClassCastException classCastException ){
				throw new PacoteInvalidoException( "Tipo de pacote incompat�vel com payload." );
			}

		} else if( tipoPacote.equals( TipoPacote.MOVIMENTO ) ){
			try{
				this.payload = (MouseEvent)payload;
				
			} catch( ClassCastException classCastException ){
				throw new PacoteInvalidoException( "Tipo de pacote incompat�vel com payload." );
			}
		} else if( tipoPacote.equals( TipoPacote.CHECK_IN ) ){
			try{
				this.payload = (Usuario)payload;
				
			} catch( ClassCastException classCastException ){
				throw new PacoteInvalidoException( "Tipo de pacote incompat�vel com payload." );
			}
			
		}
	}

	public String getIdentificadorDoDestinatario() {
		return identificadorDoDestinatario;
	}

	public void setIdentificadorDoDestinatario(String identificadorDoDestinatario) {
		this.identificadorDoDestinatario = identificadorDoDestinatario;
	}

	/**
	 * @return the tipoPacote
	 */
	public TipoPacote getTipoPacote() {
		return tipoPacote;
	}

	/**
	 * @return the identificadorDoRemetente
	 */
	public String getIdentificadorDoRemetente() {
		return identificadorDoRemetente;
	}

	/**
	 * @param identificadorDoRemetente the identificadorDoRemetente to set
	 */
	public void setIdentificadorDoRemetente(String identificadorDoRemetente) {
		this.identificadorDoRemetente = identificadorDoRemetente;
	}

	/**
	 * @param tipoPacote the tipoPacote to set
	 */
	public void setTipoPacote(TipoPacote tipoPacote) {
		this.tipoPacote = tipoPacote;
	}

	/**
	 * @return the payload
	 */
	public Object getPayload() {
		return payload;
	}

	/**
	 * @param payload the payload to set
	 */
	public void setPayload(Object payload) {
		this.payload = payload;
	}
}
